Mô hình tính toán Ngôn_ngữ_trung_gian_dùng_chung

Ngôn ngữ trung gian chung là hướng đối tượng và dựa trên ngăn xếp (stack). Điều đó có nghĩa là dữ liệu được đẩy vào ngăn xếp thay vì lấy từ thanh ghi (register) như trong hầu hết các kiến trúc CPU.

Trong x86 nó có thể trông như thế này:

add eax, edx

Khi đó, mã tương ứng ở CLI sẽ như thế này:

ldloc.0ldloc.1addstloc.0  // a = a + b or a += b;

Khái niệm hướng đối tượng

Điều này cũng mở rộng cho các khái niệm hướng đối tượng. Bạn có thể tạo các đối tượng, gọi phương thức, tương tác với các field... 

CIL được thiết kế để định hướng cho đối tượng và mọi phương thức nếu cần (với một số ngoại lệ) vào trong một lớp. Phương thức static này cũng vậy:

.class public Foo{  .method public static int32 Add(int32, int32) cil managed  {  .maxstack 2  ldarg.0 // tải số đầu tiên;  ldarg.1 // tải số thứ hai;  add // cộng hai số;  ret // trả kết quả về;  }}

Phương thức này không yêu cầu bất kỳ instance nào của Foo được khai báo vì nó là static. Điều đó có nghĩa nó thuộc về lớp và sau đó nó có thể được sử dụng như thế này trong C #:

int r = Foo.Add(2, 3);  // 5

Trong CIL:

ldc.i4.2ldc.i4.3call int32 Foo::Add(int32, int32)stloc.0

Các lớp instance

Một lớp instance chứa ít nhất một constructor và một số thành viên instance. Lớp này có một tập hợp các phương thức đại diện cho hành động của đối tượng Car.

.class public Car{  .method public specialname rtspecialname instance void.ctor(int32, int32) cil managed  {  /* Constructor */  }  .method public void Move(int32) cil managed  {  /* Bỏ qua việc hiện thực hóa */  }  .method public void TurnRight() cil managed  {  /* Bỏ qua việc hiện thực hóa */  }  .method public void TurnLeft() cil managed  {  /* Bỏ qua việc hiện thực hóa */  }  .method public void Brake() cil managed  {  /* Bỏ qua việc hiện thực hóa */  }}

Tạo đối tượng

Trong C#, các instance được tạo ra như thế này:

Car myCar = new Car(1, 4); Car yourCar = new Car(1, 3);

Trong CIL:

ldc.i4.1ldc.i4.4newobj instance void Car::.ctor(int, int)stloc.0  // myCar = new Car(1, 4);ldc.i4.1ldc.i4.3newobj instance void Car::.ctor(int, int)stloc.1  // yourCar = new Car(1, 3);

Gọi phương thức của instance:

Các phương thức của instance được gọi như sau:

myCar.Move(3);

Trong CIL:

ldloc.0  // tải đối tượng "myCar" từ stackldc.i4.3call instance void Car::Move(int32)

Metadata

CLI ghi lại thông tin về các lớp được biên dịch dưới dạng metadata. Giống như thư viện kiểu trong Mô hình Đối tượng Thành phần, điều này cho phép các ứng dụng hỗ trợ và khám phá các interface, lớp, các kiểu dữ liệu, phương thức, và các trường trong assembly. Quá trình đọc siêu dữ liệu như vậy được gọi là sự phản chiếu.

Metadata có thể là dữ liệu ở dạng thuộc tính (attributes). Thuộc tính có thể được tạo ra thủ công bằng cách mở rộng lớp Attribute. Đây là một tính năng rất mạnh, cho phép lập trình viên khi tạo các lớp có thể bổ sung các thông tin bổ sung mà người sử dụng lớp có thể sử dụng theo những cách khác nhau có tùy thuộc vào miền ứng dụng.